로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
1. 모델 요구사항 분석 | ✅ 저자: 이유정(박사)
게시글(Post) 레스토랑 정보와는 별도로 콘텐츠성 게시글을 의미하며, 다음과 같은 칼럼이 포함됩니다:
칼럼
- 제목
- 미리보기 이미지
- 본문
- 첫 페이지 노출 여부 (Boolean)
- 발행 여부 (Boolean)
- 생성 시간 (자동 생성)
- 업데이트 시간 (자동 갱신)
레스토랑(Restaurant) 레스토랑에 대한 핵심 정보와 다양한 관계를 포함하는 모델입니다:
- ==
태그(M2M)
== - 이름 (최대 100자)
- 지역 (ForeignKey →
Region
) - 지점 이름 (최대 100자)
- 대표 이미지 (ImageField)
- ==
이미지(O2M)
== - 소개 (최대 255자)
- 주소
- 평점 (Float, 예: 4.5)
- 평가 수 (Integer, 예: 123)
- 위치: 위도 (Latitude), 경도 (Longitude)
- ==
리뷰(O2M)
== - ==
블로그후기(O2M)
== - ==
메뉴(O2M)
== - 영업 시간: 시작 시간, 종료 시간
- 라스트 오더 시간
- ==
좋아요여부(O2M)
== - 폐업 여부 (Boolean)
- 특징 (CharField 또는 TextField)
관련 관계 (OneToMany, ManyToMany 등)
- 이미지들 (
RestaurantImage
- O2M) - 리뷰들 (
Review
- O2M) - 블로그 후기들 (
BlogReview
- O2M) - 메뉴들 (
Menu
- O2M) - 좋아요들 (
RestaurantLike
- O2M) - 태그들 (
Tag
- M2M)
지역(Region) 레스토랑이 위치한 주소를 계층적으로 관리하는 모델입니다:
- 광역시도 (예: 서울특별시)
- 시군구 (예: 강남구)
- 읍면동 (예: 역삼동)
레스토랑 좋아요(RestaurantLike) 사용자가 특정 레스토랑을 '좋아요'한 내역입니다:
- 레스토랑 (ForeignKey)
- 사용자 (ForeignKey)
- 생성 시간
- 업데이트 시간
태그(Tag) 레스토랑에 여러 태그를 부여할 수 있으며, 사용자별 태그 기록도 관리 가능합니다:
- 이름
- 레스토랑 (ForeignKey)
- 사용자 (ForeignKey)
- 생성 시간
- 업데이트 시간
레스토랑 이미지(RestaurantImage)
- 레스토랑 (ForeignKey)
- 이미지
- 제목
1단계: 비정규형
- 하나의 레스토랑 row에 여러 메뉴, 이미지, 리뷰, 태그 등이 붙음
- → 반복되는 값, 다중 컬럼으로 인한 데이터 중복과 갱신 이상(anomaly) 발생
1차 정규화 (1NF)
- 컬럼이 원자값을 가져야 함(더이상 쪼갤수 없는 하나의 값만 가져야 한다는뜻)
- 반복되는 필드 → 각각 별도의 테이블로 분리
RestaurantImage
,RestaurantMenu
,Review
,Tag
,ReviewImage
,Article
2차 정규화 (2NF)
- 복합키의 부분 종속성 제거
- 대부분의 테이블은
id
가 단일 기본키이므로 큰 이슈 없음 - 단,
Tag
는 "레스토랑 + 사용자"의 조합이 중복 없이 유지되어야 할 경우 복합키 고려 가능
복합키란?
- 기본키(PK)가 여러 컬럼을 묶어서 하나의 고유한 키가 되는 경우예요
예:
Tag
테이블에서restaurant_id
와user_id
두 개를 묶어서 기본키로 사용할 수도 있어요. 이유? 같은 사용자(user)가 같은 레스토랑에 중복 태그를 달면 안 되게 만들고 싶을 때!
부분 종속성 제거란?
- 복합키(
restaurant_id + user_id
)의 일부 컬럼에만 의존하는 정보는 분리하라는 뜻이에요. 예를 들어user_id
만으로도 어떤 정보를 설명할 수 있다면, 그것은Tag
에서 분리해야 해요.
3차 정규화 (3NF)
- 이행적 종속 제거
- 예: 주소에서 시도/시군구/읍면동 분리 →
Region
테이블로 정규화
최종 정규화된 10개의 테이블 목록
번호 | 테이블 이름 | 설명 |
---|---|---|
1 | Article | 게시글(칼럼), 콘텐츠성 포스트 |
2 | Restaurant | 레스토랑의 핵심 정보 |
3 | CuisineType | 음식 종류 (예: 한식, 중식, 양식) |
4 | RestaurantCategory | 레스토랑 분류 (예: 고기, 샐러드) + 음식 종류 FK 포함 |
5 | RestaurantImage | 레스토랑의 이미지들 (O2M 관계) |
6 | RestaurantMenu | 레스토랑의 메뉴들 (O2M 관계) |
7 | Review | 사용자 리뷰 (O2M, 평점 포함) |
8 | ReviewImage | 리뷰의 이미지들 (O2M 관계) |
9 | SocialChannel | 리뷰 출처 (인스타그램, 블로그 등) |
10 | Tag | 레스토랑에 연결된 태그 (ManyToMany) |
11 | Region | 지역 정보: 광역시도, 시군구, 읍면동 |
-
Restaurant
RestaurantImage
(O2M)
RestaurantMenu
(O2M)
Review
(O2M)
Tag
(M2M)
RestaurantCategory
(FK)
Region
(선택적으로 FK 가능) -
Review
ReviewImage
(O2M)
SocialChannel
(FK)